home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / stdlib1.exe / lha / SER1.ASM < prev    next >
Assembly Source File  |  1990-08-12  |  18KB  |  788 lines

  1. stdlib        segment    para public 'slcode'
  2.         assume    cs:stdlib
  3. ;
  4. ;
  5. ; Routines to handle COM1 data transmission.
  6. ;
  7. ; COM1 refers to HARDWARE COM1 port which is located beginning at port
  8. ; address 3f8h and causes INT 0Ch.
  9. ;
  10. ;
  11. ; Released to the public domain.
  12. ; Created by Randall Hyde.
  13. ; Date: 8/11/90
  14. ;
  15. ;
  16. ; Useful equates:
  17. ;
  18. BIOSvars    =    40h
  19. Com1Adrs    =    0
  20. Com2Adrs    =    2
  21. ;
  22. BufSize        =    256            ;# of bytes in buffer.
  23. ;
  24. ;
  25. ; Serial port equates:
  26. ;
  27. Com1Port    =    3F8h
  28. Com1IER        =    3F9h
  29. Com1IIR        =    3FAh
  30. Com1LCR        =    3FBh
  31. Com1MCR        =    3FCh
  32. Com1LSR        =    3FDh
  33. Com1MSR        =    3FEh
  34. ;
  35. ;
  36. ; Register assignments:
  37. ;
  38. ; Interupt enable register (IER):
  39. ;
  40. ;        If one:
  41. ; bit 0-    Enables received data available interrupt.
  42. ; bit 1-    Enables transmitter holding register empty interrupt.
  43. ; bit 2-    Enables receiver line status interrupt.
  44. ; bit 3-    Enables the modem status interrupt.
  45. ; bits 4-7-    Always set to zero.
  46. ;
  47. ; Interrupt ID Register (IIR):
  48. ;
  49. ; bit 0-    No interrupt is pending (interrupt pending if zero).
  50. ; bits 1,2-    Binary value denoting source of interrupt:
  51. ;            00-Modem status
  52. ;            01-Transmitter Hold Register Empty
  53. ;            10-Received Data Available
  54. ;            11-Receiver line status
  55. ; bits 3-7    Always zero.
  56. ;
  57. ;
  58. ; Line Control Register (LCR):
  59. ;
  60. ; bits 0,1-    Word length (00=5, 01=6, 10=7, 11=8 bits).
  61. ; bit 2-    Stop bits (0=1, 1=2 stop bits [1-1/2 if 5 data bits]).
  62. ; bit 3-    Parity enabled if one.
  63. ; bit 4-    0 for odd parity, 1 for even parity (assuming bit 3 = 1).
  64. ; bit 5-    1 for stuck parity.
  65. ; bit 6-    1=force break.
  66. ; bit 7-    1=Divisor latch access bit.  0=rcv/xmit access bit.
  67. ;
  68. ; Modem Control Register (MCR):
  69. ;
  70. ; bit 0-    Data Terminal Ready (DTR)
  71. ; bit 1-    Request to send (RTS)
  72. ; bit 2-    OUT 1
  73. ; bit 3-    OUT 2
  74. ; bit 4-    Loop back control.
  75. ; bits 5-7-    Always zero.
  76. ;
  77. ; Line Status Register (LSR):
  78. ;
  79. ; bit 0-    Data Ready
  80. ; bit 1-    Overrun error
  81. ; bit 2-    Parity error
  82. ; bit 3-    Framing error
  83. ; bit 4-    Break Interrupt
  84. ; bit 5-    Transmitter holding register is empty.
  85. ; bit 6-    Transmit shift register is empty.
  86. ; bit 7-    Always zero.
  87. ;
  88. ; Modem Status Register (MSR):
  89. ;
  90. ; bit 0-    Delta CTS
  91. ; bit 1-    Delta DSR
  92. ; bit 2-    Trailing edge ring indicator
  93. ; bit 3-    Delta carrier detect
  94. ; bit 4-    Clear to send
  95. ; bit 5-    Data Set Ready
  96. ; bit 6-    Ring indicator
  97. ; bit 7-    Data carrier detect
  98. ;
  99.  
  100. ;
  101. ; sl_Com1Baud: Set the COM1 port baud rate
  102. ; AX = baud rate (110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200)
  103. ;
  104.         public    sl_Com1Baud
  105. sl_Com1Baud    proc    far
  106.         push    ax
  107.         push    dx
  108.         cmp    ax, 9600
  109.         ja    Set19200
  110.         je    Set9600
  111.         cmp    ax, 2400
  112.         ja    Set4800
  113.         je    Set2400
  114.         cmp    ax, 600
  115.         ja    Set1200
  116.         je    Set600
  117.         cmp    ax, 150
  118.         ja    Set300
  119.         je    Set150
  120.         mov    ax, 1047        ;Default to 110 baud
  121.         jmp    short SetPort
  122. ;
  123. Set150:        mov    ax, 768
  124.         jmp    short SetPort
  125. ;
  126. Set300:        mov    ax, 384
  127.         jmp    short SetPort
  128. ;
  129. Set600:        mov    ax, 192
  130.         jmp    short SetPort
  131. ;
  132. Set1200:    mov    ax, 96
  133.         jmp    short SetPort
  134. ;
  135. Set2400:    mov    ax, 48
  136.         jmp    short SetPort
  137. ;
  138. Set4800:    mov    ax, 24
  139.         jmp    short SetPort
  140. ;
  141. Set9600:    mov    ax, 12
  142.         jmp    short SetPort
  143. ;
  144. Set19200:    mov    ax, 6
  145. SetPort:    mov    dx, ax            ;Save baud value.
  146.         call    far ptr sl_GetLCRCom1
  147.         push    ax            ;Save old divisor bit value.
  148.         or    al, 80h            ;Set divisor select bit.
  149.         call    far ptr sl_SetLCRCom1
  150.         mov    ax, dx            ;Get baud rate divisor value.
  151.         mov    dx, Com1Port
  152.         out    dx, al
  153.         inc     dx
  154.         mov    al, ah
  155.         out    dx, al
  156.         mov    dx, Com1LCR
  157.         pop    ax
  158.         call    far ptr sl_SetLCRCom1    ;Restore divisor bit value.
  159.         pop    dx
  160.         pop    ax
  161.         ret
  162. sl_Com1Baud    endp
  163. ;
  164. ;
  165. ; sl_Com1Stop:
  166. ; Set the number of stop bits.
  167. ;
  168. ; AL=1 for one stop bit, 2 for two stop bits.
  169. ;
  170.         public    sl_com1Stop
  171. sl_com1Stop    proc    far
  172.         push    ax
  173.         push    dx
  174.         dec    ax
  175.         shl    ax, 1            ;position into bit #2
  176.         shl    ax, 1
  177.         mov    ah, al
  178.         mov    dx, Com1LCR
  179.         in    al, dx
  180.         and     al, 11111011b        ;Mask out Stop Bits bit
  181.         or    al, ah            ;Mask in new # of stop bits.
  182.         out    dx, al
  183.         pop    dx
  184.         pop    ax
  185.         ret
  186. sl_com1Stop    endp
  187. ;
  188. ;
  189. ; sl_com1size: Sets word size on the com1 port.
  190. ; AX = 5, 6, 7, or 8 which is the number of bits to set.
  191. ;
  192.         public    sl_com1size
  193. sl_com1size    proc    far
  194.         push    ax
  195.         push    dx
  196.         sub    al, 5
  197.         cmp    al, 3
  198.         jbe    Okay
  199.         mov    al, 3            ;Default to eight bits.
  200. Okay:        mov    ah, al
  201.         mov    dx, com1LCR
  202.         in    al, dx
  203.         and    al, 11111100b        ;Mask out old word size
  204.         or    al, ah            ;Mask in new word size
  205.         out    dx, al
  206.         pop    dx
  207.         pop    ax
  208.         ret
  209. sl_com1size    endp
  210. ;
  211. ;
  212. ; sl_com1parity: Turns parity on/off, selects even/odd parity, or stuck parity.
  213. ; ax contains the following:
  214. ;
  215. ; bit 0-    1 to enable parity, 0 to disable.
  216. ; bit 1-    0 for odd parity, 1 for even (only valid if bit 0 is 1).
  217. ; bit 2-    Stuck parity bit.  If 1 and bit 0 is 1, then the parity bit
  218. ;        is always set to the inverse of bit 1.
  219. ;
  220.         public    sl_com1parity
  221. sl_com1parity    proc    far
  222.         push    ax
  223.         push    dx
  224. ;
  225.         shl    ax, 1
  226.         shl    ax, 1
  227.         shl    ax, 1
  228.         and    ax, 00111000b        ;Mask out other data.
  229.         mov    ah, al
  230.         mov    dx, com1LCR
  231.         in    al, dx
  232.         and    al, 11000111b
  233.         or    al, ah
  234.         out    dx, al
  235.         pop    dx
  236.         pop    ax
  237.         ret
  238. sl_com1parity    endp
  239. ;
  240. ;
  241. ;****************************************************************************
  242. ;
  243. ; Polled I/O:
  244. ;
  245. ;
  246. ; sl_ReadCom1-    Reads a character from COM1 and returns that character in
  247. ;        the AL register.  Synchronous call, meaning it will not
  248. ;        return until a character is available.
  249. ;
  250.         public    sl_ReadCom1
  251. sl_ReadCom1    proc    far
  252.         push    dx
  253.         call    far ptr sl_GetLCRCom1
  254.         push    ax            ;Save divisor latch access bit.
  255.         and    al, 7fh            ;Select normal port.
  256.         call    far ptr sl_SetLCRCom1
  257.         mov    dx, com1LSR
  258. WaitForChar:    call    far ptr sl_GetLSRCom1
  259.         test    al, 1            ;Data Available?
  260.         jz    WaitForChar
  261.         mov    dx, com1Port
  262.         in    al, dx
  263.         mov    dl, al            ;Save character
  264.         pop    ax            ;Restore divisor access bit.
  265.         call    far ptr sl_SetLCRCom1
  266.         mov    al, dl            ;Restore output character.
  267.         pop    dx
  268.         ret
  269. sl_ReadCom1    endp
  270. ;
  271. ;
  272. ;
  273. ; sl_WriteCom1-    Writes the character in AL to the com1 port.
  274. ;
  275.         public    sl_WriteCom1
  276. sl_WriteCom1    proc    far
  277.         push    dx
  278.         push    ax
  279.         mov    dl, al            ;Save character to output
  280.         call    far ptr sl_GetLCRCom1
  281.         push    ax            ;Save divisor latch access bit.
  282.         and    al, 7fh            ;Select normal port.
  283.         call    far ptr sl_SetLCRCom1
  284. WaitForXmtr:    call    far ptr sl_GetLSRCom1
  285.         test    al, 00100000b        ;Xmtr buffer empty?
  286.         jz    WaitForXmtr
  287.         mov    al, dl            ;Get output character.
  288.         mov    dx, Com1Port
  289.         out    dx, al
  290.         pop    ax            ;Restore divisor access bit.
  291.         call    far ptr sl_SetLCRCom1
  292.         pop    ax
  293.         pop    dx
  294.         ret
  295. sl_WriteCom1    endp
  296. ;
  297. ;
  298. ;
  299. ; sl_TstInpCom1-Returns AL=0 if a character is not available at the com1 port.
  300. ;        Returns AL=1 if a character is available.
  301. ;
  302.         public    sl_TstInpCom1
  303. sl_TstInpCom1    proc    far
  304.         push    dx
  305.         mov    dx, com1LSR
  306.         in    al, dx
  307.         and     al, 1
  308.         pop    dx
  309.         ret
  310. sl_TstInpCom1    endp
  311. ;
  312. ;
  313. ; sl_TstOutCom1-Returns AL=1 when it's okay to send another character to
  314. ;        the transmitter.  Returns zero if the transmitter is full.
  315. ;
  316.         public    sl_TstOutCom1
  317. sl_TstOutCom1    proc    far
  318.         push    dx
  319.         mov    dx, com1LSR
  320.         in    al, dx
  321.         test    al, 00100000b
  322.         mov    al, 0
  323.         jz    toc1
  324.         inc    ax
  325. toc1:        pop    dx
  326.         ret
  327. sl_TstOutCom1    endp
  328. ;
  329. ;
  330. ; sl_GetLSRCom1-Returns the LSR in al:
  331. ;
  332. ; AL:
  333. ;    bit 0-    Data Ready
  334. ;    bit 1-    Overrun error
  335. ;    bit 2-    Parity error
  336. ;    bit 3-    Framing error
  337. ;    bit 4-    Break interrupt
  338. ;    bit 5-    Xmtr holding register is empty.
  339. ;    bit 6-    Xmtr shift register is empty.
  340. ;    bit 7-    Always zero.
  341. ;
  342.         public    sl_GetLSRCom1
  343. sl_GetLSRCom1    proc    far
  344.         push    dx
  345.         mov    dx, com1LSR
  346.         in    al, dx
  347.         pop    dx
  348.         ret
  349. sl_GetLSRCom1    endp
  350. ;
  351. ;
  352. ; sl_GetMSRCom1-Returns the modem status register in AL
  353. ;
  354. ; AL:
  355. ;    bit 0-    Delta clear to send
  356. ;    bit 1-    Delta data set ready
  357. ;    bit 2-    Trailing edge ring indicator
  358. ;    bit 3-    Delta data carrier detect
  359. ;    bit 4-    Clear to send (CTS)
  360. ;    bit 5-    Data set ready (DSR)
  361. ;    bit 6-    Ring indicator (RI)
  362. ;    bit 7-    Data carrier detect (DCD)
  363. ;
  364.         public    sl_GetMSRCom1
  365. sl_GetMSRCom1    proc    far
  366.         push    dx
  367.         mov    dx, com1MSR
  368.         in    al, dx
  369.         pop    dx
  370.         ret
  371. sl_GetMSRCom1    endp
  372. ;
  373. ;
  374. ; sl_SetMCRCom1-Writes the data in AL to the modem control register.
  375. ; sl_GetMCRCom1-Reads the data from the modem control register into AL.
  376. ;
  377. ; AL:
  378. ;    bit 0-    Data terminal ready (DTR)
  379. ;    bit 1-    Request to send (RTS)
  380. ;    bit 2-    Out